package main

import (
	"errors"
	"fmt"
)

// panic会导致服务终止，平时开发的时候很少用到，他的使用场景就是服务启动过程的初始化
// 比如，服务启动需要连接数据库，加密机，检查配置文件是否存在，依赖服务是否启动成功等，
// 关键地方，可以用err和panic结合使用

func init_func() (int, error) {
	ret := -1
	// 可以用recover这个函数能捕获到panic
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("recoverd if init_func: ", r)
		}
	}()
	//var names map[string]string
	//names["go"] = "go工程师"
	return ret, errors.New("init error")
}

// defer 语句需要在 panic 之前声明才会起作用
// recover 可以捕获panic异常和系统异常
// recover必须要写道defer的函数中才会生效
// recover异常处理后，逻辑并不会恢复到panic的哪个点去
func main() {

	// 在main函数的开始部分声明defer和recover
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered in main:", r)
		}
	}()

	fmt.Println("服务开始启动,调用init_func进行初始化...")
	if _, err := init_func(); err != nil {
		fmt.Println("服务初始化失败...")

		panic("init_func errs")

		defer func() {
			if r := recover(); r != nil {
				fmt.Println("Recovered in main:", r)
			}
		}()

		fmt.Println("服务初始化失败 end...")
	}
	fmt.Println("服务初始化成功...")

}
